// 输入: { a: 1, b: { c: 2 }, d: [3, 4] }
// 输出: 全新的对象，与原对象无引用关系


function deepCloneSimple(obj) {
    // 你的代码
    if (typeof obj !== 'object' || obj === null) {
        return obj
    }
    
    if (Array.isArray(obj)) {
        let newArr = [];
        for (let i = 0; i < obj.length; i++) {
            newArr[i] = deepClone(obj[i]);
        }
        return newArr;
    } else {
        let newObj = {};
        for (let key in obj) {
            if (obj.hasOwnProperty(key)) {  // 确保只复制自己的属性
                newObj[key] = deepClone(obj[key]);
            }
        }
        return newObj;
    }
}

const deepCloneWithMessageChannel = (obj) => {
    return new Promise((resolve, reject) => {
        const { port1, port2 } = new MessageChannel();
        port1.postMessage(obj)
        port2.onmessage = (e) => {
            resolve(e.data)
            //port1.close()
            //port2.close()
        }
        
    })
};

function deepClone(obj, hash = new WeakMap()) {
    // 处理基本数据类型和 null
    if (obj === null || typeof obj !== 'object') {
        return obj;
    }
    // 处理循环引用
    if (hash.has(obj)) {
        return hash.get(obj);
    }
    
    // 处理 Date 对象
    if (obj instanceof Date) {
        return new Date(obj);
    }
    
    // 处理 RegExp 对象
    if (obj instanceof RegExp) {
        return new RegExp(obj);
    }
    
    // 处理数组
    if (Array.isArray(obj)) {
        const arrCopy = [];
        hash.set(obj, arrCopy);
        obj.forEach((item, index) => {
            arrCopy[index] = deepClone(item, hash);
        });
        return arrCopy;
    }
    
    const objCopy = Object.create(Object.getPrototypeOf(obj));
    hash.set(obj, objCopy);
    
    // 使用 Reflect.ownKeys 获取所有自有属性（包括 Symbol）
    Reflect.ownKeys(obj).forEach(key => {
        objCopy[key] = deepClone(obj[key], hash);
    });
    
    return objCopy;
}
